home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / icon tools / deft ii / sources / work.em < prev    next >
Text File  |  1996-04-07  |  9KB  |  366 lines

  1. OPT MODULE
  2.  
  3.  
  4. /*/////////////////////////////////////////////////////////////////////////////
  5. ///////////////////////////////////////////////////////////// Macro files /////
  6. ///////////////////////////////////////////////////////////////////////////////
  7. MACROS 'MUI.pma'
  8. */
  9.  
  10.  
  11. ->*****
  12. ->** External modules
  13. ->*****
  14. MODULE 'libraries/mui'
  15. MODULE 'tools/boopsi' , 'tools/installhook'
  16. MODULE 'utility/tagitem' , 'utility/hooks'
  17. MODULE 'icon' , 'workbench/workbench'
  18. MODULE 'dos/dos' , 'dos/exall'
  19.  
  20. MODULE '*Locale'
  21. MODULE '*Defs'
  22. MODULE '*GUI_MUIB'
  23. MODULE '*Errors'
  24.  
  25.  
  26. ->*****
  27. ->** Error handling
  28. ->*****
  29. RAISE    "MEM"    IF    AllocDosObject()        =    NIL    ,
  30.         "MEM"    IF    ParsePatternNoCase()    =    -1
  31.  
  32.  
  33. ->*****
  34. ->** Constant definitions
  35. ->*****
  36. CONST    EXALL_BUFFER_SIZE    =    1024
  37.  
  38. ENUM    SCAN_OK            =    1    ,
  39.         STOP_SCAN                ,
  40.         INCORRECT_DIR            ,
  41.         SCAN_ERROR
  42.  
  43.  
  44. ->*****
  45. ->** Global variables
  46. ->*****
  47. EXPORT DEF deftII    :    PTR TO obj_app
  48. EXPORT DEF cat        :    PTR TO catalog_DeftII
  49. EXPORT DEF modified    :    LONG
  50.  
  51. DEF icon_pattern    :    PTR TO CHAR
  52. DEF matchfunc_hook    :    PTR TO hook
  53.  
  54.  
  55. /**********************************************************
  56. ** Initializes the icon_pattern to the '#?.info' pattern **
  57. **********************************************************/
  58. EXPORT PROC init_go()
  59.  
  60.     ParsePatternNoCase( '#?.info' , NEW icon_pattern[ 30 ] , 30 )
  61.     installhook( NEW matchfunc_hook , {matchfunc} )
  62.  
  63. ENDPROC
  64.  
  65.  
  66. /**************************************/
  67. /* Like StrCmp() but case insensitive */
  68. /**************************************/
  69. EXPORT PROC str_cmp_no_case( string1 : PTR TO CHAR , string2 : PTR TO CHAR )
  70.  
  71.     DEF same = FALSE
  72.  
  73. ->    DEF i =0 , same = TRUE , upper_char1 = 0 , upper_char2 = 0
  74. ->    WHILE same AND ( string1[ i ] <> 0 ) AND ( string2[ i ] <> 0 )
  75. ->        IF string1[ i ] <> string2[ i ]
  76. ->            upper_char1 := IF ( string1[ i ] >= "a" ) AND ( string1[ i ] <= "z" ) THEN string1[ i ] - 32 ELSE string1[ i ]
  77. ->            upper_char2 := IF ( string2[ i ] >= "a" ) AND ( string2[ i ] <= "z" ) THEN string2[ i ] - 32 ELSE string2[ i ]
  78. ->            IF upper_char1 <> upper_char2 THEN same := FALSE
  79. ->        ENDIF
  80. ->        INC i
  81. ->    ENDWHILE
  82. ->ENDPROC IF ( string1[ i ] = 0 ) AND ( string2[ i ] = 0 ) THEN TRUE ELSE FALSE
  83.  
  84.     MOVE.L    string1 , A1
  85.     CMPA.L    #0 , A1
  86.     BEQ.B    final_end
  87.     MOVE.L    string2 , A2
  88.     CMPA.L    #0 , A2
  89.     BEQ.B    final_end
  90. loop_while:
  91.     MOVE.B    (A1)+ , D1
  92.     MOVE.B    (A2)+ , D2
  93.     TST.B    D1
  94.     BNE.B    second_test
  95.     TST.B    D2
  96.     BNE.B    final_end
  97.     MOVE.L    #-1 , same
  98.     BRA.B    final_end
  99. second_test:
  100.     TST.B    D2
  101.     BEQ.B    final_end
  102. insidewhile:
  103.         CMP.B    D1 , D2
  104.         BEQ.B    loop_while
  105.         CMP.B    #"a" , D1
  106.         BCS.B    char1_ok
  107.         CMP.B    #"z" , D1
  108.         BHI.B    char1_ok
  109.         SUB.B    #32 , D1
  110. char1_ok:
  111.         CMP.B    #"a" , D2
  112.         BCS.B    char2_ok
  113.         CMP.B    #"z" , D2
  114.         BHI.B    char2_ok
  115.         SUB.B    #32 , D2
  116. char2_ok:
  117.         CMP.B    D1 , D2
  118.         BEQ.B    loop_while
  119. final_end:
  120.  
  121. ENDPROC same
  122.  
  123.  
  124. /**************************************************************/
  125. /* The function which runs the icon default tool replacements */
  126. /**************************************************************/
  127. EXPORT PROC go( error_messages )
  128.  
  129.     DEF wrong_path_met = FALSE
  130.     DEF path_str : PTR TO CHAR
  131.     DEF result , i = 0
  132.     DEF return = 0
  133.     DEF old_priority
  134.  
  135.     old_priority := SetTaskPri( FindTask( NIL ) , -5 )
  136.     
  137.     set( deftII.lv_paths , MUIA_List_Quiet , MUI_TRUE )
  138.  
  139.     REPEAT
  140.  
  141.         domethod( deftII.lv_paths , [ MUIM_List_GetEntry , i++ , {path_str} ] )
  142.         IF path_str <> NIL
  143.  
  144.             result := scan_dir( path_str , path_str , error_messages )
  145.  
  146.             IF result = INCORRECT_DIR
  147.  
  148.                 domethod( deftII.lv_paths , [ MUIM_List_Remove , i-- ] )
  149.                 wrong_path_met := TRUE
  150.  
  151.             ENDIF
  152.  
  153.         ENDIF
  154.  
  155.     UNTIL ( path_str = NIL ) OR ( result = STOP_SCAN ) OR ( result = SCAN_ERROR )
  156.  
  157.     IF wrong_path_met
  158.  
  159.         IF error_messages THEN deftII_error( cat.msg_Wrong_Path_Met.getstr() )
  160.         modified := TRUE
  161.  
  162.     ENDIF
  163.  
  164.     set( deftII.lv_paths , MUIA_List_Quiet , FALSE )
  165.  
  166.     set( deftII.tx_info , MUIA_Text_Contents , cat.msg_TX_info.getstr() )
  167.  
  168.     domethod( deftII.app , [ MUIM_MultiSet , MUIA_Disabled , FALSE ,
  169.             deftII.gr_paths , deftII.gr_default_tools ,
  170.             deftII.bt_go , deftII.bt_save_prefs , deftII.bt_about , deftII.bt_quit , NIL ] )
  171.  
  172.     SetTaskPri( FindTask( NIL ) , old_priority )
  173.  
  174.     IF wrong_path_met THEN return := 10
  175.     IF result = STOP_SCAN THEN return := return + 5
  176.     IF result = SCAN_ERROR THEN return := return + 100
  177.  
  178. ENDPROC return
  179.  
  180.  
  181. /**************************************************************/
  182. /* Recursively scan a directory to replace icon default tools */
  183. /**************************************************************/
  184. PROC scan_dir( dir_name : PTR TO CHAR , previous_path : PTR TO CHAR , error_messages ) HANDLE
  185.  
  186.     DEF eac : PTR TO exallcontrol
  187.     DEF fib : PTR TO fileinfoblock
  188.     DEF entry : PTR TO exalldata
  189.     DEF current_dir = NIL , parent_dir = NIL
  190.     DEF more = FALSE , i , j , found
  191.     DEF icon_name[ 32 ] : STRING , icon : PTR TO diskobject
  192.     DEF def_tool : PTR TO default_tool
  193.     DEF error_buf[ 81 ] : ARRAY OF CHAR , error_num
  194.     DEF complete_path[ 512 ] : STRING
  195.     DEF buffer : PTR TO CHAR , defaulttool_bak : PTR TO CHAR
  196.     DEF scan_result , signals
  197.  
  198.     NEW buffer[ EXALL_BUFFER_SIZE ]
  199.     eac := ( eac := NIL ) BUT AllocDosObject( DOS_EXALLCONTROL , NIL )
  200.     fib := ( fib := NIL ) BUT AllocDosObject( DOS_FIB , NIL )
  201.  
  202.     IF ( current_dir := Lock( dir_name , SHARED_LOCK ) ) = NIL
  203.  
  204.         FreeDosObject( DOS_FIB , fib )
  205.         FreeDosObject( DOS_EXALLCONTROL , eac )
  206.         RETURN INCORRECT_DIR
  207.  
  208.     ENDIF
  209.  
  210.     IF Examine( current_dir , fib ) = FALSE
  211.  
  212.         UnLock( current_dir )
  213.         FreeDosObject( DOS_FIB , fib )
  214.         FreeDosObject( DOS_EXALLCONTROL , eac )
  215.         RETURN INCORRECT_DIR
  216.  
  217.     ENDIF
  218.  
  219.     IF fib.direntrytype < 0
  220.  
  221.         UnLock( current_dir )
  222.         FreeDosObject( DOS_FIB , fib )
  223.         FreeDosObject( DOS_EXALLCONTROL , eac )
  224.         RETURN INCORRECT_DIR
  225.  
  226.     ENDIF
  227.  
  228.     FreeDosObject( DOS_FIB , fib )    ;    fib := NIL
  229.     parent_dir := CurrentDir( current_dir )
  230.  
  231.     eac.lastkey := 0
  232.     eac.matchstring := NIL
  233.     eac.matchfunc := matchfunc_hook
  234.  
  235.     REPEAT
  236.  
  237.         more := ExAll( current_dir , buffer , EXALL_BUFFER_SIZE , ED_TYPE , eac )
  238.         error_num := IoErr()
  239.  
  240.         IF domethod( deftII.app , [ MUIM_Application_Input , {signals} ] ) = ID_BT_STOP
  241.  
  242.             IF more THEN ExAllEnd( current_dir , buffer , EXALL_BUFFER_SIZE , ED_TYPE , eac )
  243.             CurrentDir( parent_dir )
  244.             UnLock( current_dir )
  245.             FreeDosObject( DOS_EXALLCONTROL , eac )
  246.             RETURN STOP_SCAN
  247.  
  248.         ENDIF
  249.  
  250.         entry := buffer
  251.  
  252.         FOR i := 1 TO eac.entries
  253.  
  254.             IF entry.type >= 0
  255.  
  256.                 StrCopy( complete_path , previous_path , ALL )
  257.                 AddPart( complete_path , entry.name , 512 )
  258.                 SetStr( complete_path , StrLen( complete_path ) )
  259.  
  260.                 IF ( scan_result := scan_dir( entry.name , complete_path , error_messages ) ) <> SCAN_OK
  261.  
  262.                     ExAllEnd( current_dir , buffer , EXALL_BUFFER_SIZE , ED_TYPE , eac )
  263.                     CurrentDir( parent_dir )
  264.                     UnLock( current_dir )
  265.                     FreeDosObject( DOS_EXALLCONTROL , eac )
  266.                     RETURN scan_result
  267.  
  268.                 ENDIF
  269.  
  270.             ELSE
  271.  
  272.                 IF ( icon := GetDiskObject( StrCopy ( icon_name , entry.name , StrLen( entry.name ) - 5 ) ) ) <> NIL
  273.  
  274.                     IF icon.type = WBPROJECT
  275.  
  276.                         j := 0
  277.                         found := FALSE
  278.  
  279.                         REPEAT
  280.  
  281.                             domethod( deftII.lv_default_tools , [ MUIM_List_GetEntry , j++ , {def_tool} ] )
  282.  
  283.                             IF def_tool <> NIL
  284.  
  285.                                 IF def_tool.pattern
  286.  
  287.                                     found := MatchPatternNoCase( def_tool.pattern , icon.defaulttool )
  288.  
  289.                                 ELSE
  290.  
  291.                                     found := str_cmp_no_case( icon.defaulttool , def_tool.old )
  292.  
  293.                                 ENDIF
  294.  
  295.                             ENDIF
  296.  
  297.                         UNTIL ( def_tool = NIL ) OR found
  298.  
  299.                         IF found
  300.  
  301.                             IF str_cmp_no_case( icon.defaulttool , def_tool.new ) = FALSE
  302.  
  303.                                 defaulttool_bak := icon.defaulttool
  304.                                 icon.defaulttool :=  def_tool.new
  305.                                 PutDiskObject( icon_name , icon )
  306.                                 icon.defaulttool := defaulttool_bak
  307.                         
  308.                                 StrCopy( complete_path , previous_path , ALL )
  309.                                 AddPart( complete_path , entry.name , 512 )
  310.                                 SetStr( complete_path , StrLen( complete_path ) )
  311.                                 set( deftII.tx_info , MUIA_Text_Contents , complete_path )
  312.  
  313.                             ENDIF
  314.  
  315.                         ENDIF
  316.  
  317.                     ENDIF
  318.  
  319.                     FreeDiskObject( icon )
  320.  
  321.                 ENDIF
  322.  
  323.             ENDIF
  324.  
  325.             entry := entry.next
  326.  
  327.         ENDFOR
  328.  
  329.     UNTIL more = FALSE
  330.  
  331.     IF error_num <> ERROR_NO_MORE_ENTRIES
  332.  
  333.         CurrentDir( parent_dir )
  334.         UnLock( current_dir )
  335.         FreeDosObject( DOS_EXALLCONTROL , eac )
  336.  
  337.         Fault( error_num , NIL , error_buf , 80 )
  338.         IF error_messages THEN deftII_error( error_buf )
  339.  
  340.         RETURN SCAN_ERROR
  341.  
  342.     ENDIF
  343.  
  344.     CurrentDir( parent_dir )
  345.     UnLock( current_dir )
  346.     FreeDosObject( DOS_EXALLCONTROL , eac )
  347.     END buffer[ EXALL_BUFFER_SIZE ]
  348.  
  349. EXCEPT
  350.  
  351.     IF more THEN ExAllEnd( current_dir , buffer , EXALL_BUFFER_SIZE , ED_TYPE , eac )
  352.     IF parent_dir THEN CurrentDir( parent_dir )
  353.     IF current_dir THEN UnLock( current_dir )
  354.     IF fib THEN FreeDosObject( DOS_FIB , fib )
  355.     IF eac THEN FreeDosObject( DOS_EXALLCONTROL , eac )
  356.  
  357.     ReThrow()
  358.  
  359. ENDPROC SCAN_OK
  360.  
  361.  
  362. /**********************************************************************
  363. ** Hook function called by ExAll() to see if an entry is a directory **
  364. **********************************************************************/
  365. PROC matchfunc( hook , ptype : PTR TO LONG , ed : PTR TO exalldata ) RETURN ( ed.type >= 0 ) OR ( MatchPatternNoCase( icon_pattern , ed.name ) )
  366.